<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="Ctey7" id="Ctey7"><span data-lake-id="u42db40cf" id="u42db40cf">典型回答</span></h1>
  <p data-lake-id="u728c26eb" id="u728c26eb"><br></p>
  <p data-lake-id="u31620be0" id="u31620be0"><span data-lake-id="ufa9509e0" id="ufa9509e0" class="lake-fontsize-12" style="color: rgb(36, 41, 47)">SQL-92 标准还定义了 4 种隔离级别来解决脏读、幻读、不可重复读等这些异常情况，从高到底依次为：可串行化(Serializable)、可重复读(Repeatable reads)、提交读(Read committed)、未提交读(Read uncommitted)。</span></p>
  <p data-lake-id="uf026246d" id="uf026246d"><span data-lake-id="uf23384bd" id="uf23384bd" class="lake-fontsize-12" style="color: rgb(36, 41, 47)">​</span><br></p>
  <p data-lake-id="uef3ba813" id="uef3ba813"><strong><span data-lake-id="u8c7967e6" id="u8c7967e6" class="lake-fontsize-12" style="color: rgb(36, 41, 47)">未提交读(Read uncommitted)</span></strong><span data-lake-id="u387d287c" id="u387d287c" class="lake-fontsize-12" style="color: rgb(36, 41, 47)">是最低的隔离级别。通过名字我们就可以知道，在这种事务隔离级别下，一个事务可以读到另外一个事务未提交的数据。这种隔离级别下会存在幻读、不可重复读和脏读的问题。</span></p>
  <p data-lake-id="ub2112e46" id="ub2112e46"><span data-lake-id="u7231420d" id="u7231420d" class="lake-fontsize-12" style="color: rgb(36, 41, 47)">​</span><br></p>
  <p data-lake-id="u07991b6d" id="u07991b6d"><strong><span data-lake-id="u5095ee8c" id="u5095ee8c" class="lake-fontsize-12" style="color: rgb(36, 41, 47)">提交读(Read committed)</span></strong><span data-lake-id="u74c2b51a" id="u74c2b51a" class="lake-fontsize-12" style="color: rgb(36, 41, 47)">也可以翻译成读已提交，通过名字也可以分析出，在一个事务修改数据过程中，如果事务还没提交，其他事务不能读该数据。所以，这种隔离级别是可以避免脏读的发生的。</span></p>
  <p data-lake-id="u59ff14e7" id="u59ff14e7"><span data-lake-id="ufa4fca64" id="ufa4fca64" class="lake-fontsize-12" style="color: rgb(36, 41, 47)">​</span><br></p>
  <p data-lake-id="u28c741d8" id="u28c741d8"><strong><span data-lake-id="u4a5ecd3a" id="u4a5ecd3a" class="lake-fontsize-12" style="color: rgb(36, 41, 47)">可重复读(Repeatable reads)</span></strong><span data-lake-id="u894b059d" id="u894b059d" class="lake-fontsize-12" style="color: rgb(36, 41, 47)">，由于提交读隔离级别会产生不可重复读的读现象。所以，比提交读更高一个级别的隔离级别就可以解决不可重复读的问题。这种隔离级别就叫可重复读。但是这种隔离级别没办法彻底解决幻读。</span></p>
  <p data-lake-id="uc847031e" id="uc847031e"><span data-lake-id="uee5ae099" id="uee5ae099" class="lake-fontsize-12" style="color: rgb(36, 41, 47)">​</span><br></p>
  <p data-lake-id="u370eae56" id="u370eae56"><strong><span data-lake-id="ue7747fdb" id="ue7747fdb" class="lake-fontsize-12" style="color: rgb(36, 41, 47)">可串行化(Serializable)</span></strong><span data-lake-id="u62fda8eb" id="u62fda8eb" class="lake-fontsize-12" style="color: rgb(36, 41, 47)">是最高的隔离级别，前面提到的所有的隔离级别都无法解决的幻读，在可串行化的隔离级别中可以解决。</span></p>
  <p data-lake-id="u514a26bf" id="u514a26bf"><span data-lake-id="ub2bb1f96" id="ub2bb1f96" class="lake-fontsize-12" style="color: rgb(36, 41, 47)">​</span><br></p>
  <p data-lake-id="uc79a71de" id="uc79a71de"><img src="https://cdn.nlark.com/yuque/0/2022/png/5378072/1671361908245-fbc00be3-2782-40d9-b7a8-1cea0602e706.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_122%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="ube956a5d" id="ube956a5d"><br></p>
  <p data-lake-id="u9b819fd4" id="u9b819fd4"><span data-lake-id="uf4f575d5" id="uf4f575d5" class="lake-fontsize-12" style="color: rgb(36, 41, 47)">注意！！！以上是SQL-92标准中对事务隔离级别以及需要解决的读现象（脏读、幻读、不可重复读）的定义，但是不同的数据库在实际实现的过程中，是有一些细微差异的。</span></p>
  <p data-lake-id="u0a94d145" id="u0a94d145"><span data-lake-id="uba4a598c" id="uba4a598c" class="lake-fontsize-12" style="color: rgb(36, 41, 47)">​</span><br></p>
  <h1 data-lake-id="m9qgN" id="m9qgN"><span data-lake-id="u6a6452b6" id="u6a6452b6">扩展知识</span></h1>
  <p data-lake-id="uf096dfb0" id="uf096dfb0"><br></p>
  <h2 data-lake-id="fK5m3" id="fK5m3"><span data-lake-id="uf5ea9c51" id="uf5ea9c51">事务隔离级别相关命令</span></h2>
  <p data-lake-id="u4d5eda5e" id="u4d5eda5e"><br></p>
  <p data-lake-id="u464d841b" id="u464d841b"><span data-lake-id="u75d3dfe5" id="u75d3dfe5">1.查看当前会话隔离级别</span></p>
  <p data-lake-id="ud2b18d0a" id="ud2b18d0a"><br></p>
  <p data-lake-id="u8e7f64ce" id="u8e7f64ce"><code data-lake-id="u7d203960" id="u7d203960"><span data-lake-id="u13f43d11" id="u13f43d11">select @@tx_isolation;</span></code></p>
  <p data-lake-id="uc3f004e1" id="uc3f004e1"><span data-lake-id="u9b066464" id="u9b066464">​</span><br></p>
  <p data-lake-id="u1674311f" id="u1674311f"><span data-lake-id="ue649ae05" id="ue649ae05">在MySQL 8.0中：</span><code data-lake-id="ud01a1c84" id="ud01a1c84"><span data-lake-id="ub18aadfb" id="ub18aadfb">SELECT @@transaction_isolation;</span></code></p>
  <p data-lake-id="uc34b2999" id="uc34b2999"><br></p>
  <p data-lake-id="u8539e03f" id="u8539e03f"><span data-lake-id="u2c1761ee" id="u2c1761ee">2.查看系统当前隔离级别</span></p>
  <p data-lake-id="u34fc8645" id="u34fc8645"><br></p>
  <p data-lake-id="u3a50b223" id="u3a50b223"><code data-lake-id="u43e7347d" id="u43e7347d"><span data-lake-id="u0abbd956" id="u0abbd956">select @@global.tx_isolation;</span></code></p>
  <p data-lake-id="u7eadbbb4" id="u7eadbbb4"><br></p>
  <p data-lake-id="ueb477879" id="ueb477879"><span data-lake-id="u34c61c20" id="u34c61c20">3.设置当前会话隔离级别</span></p>
  <p data-lake-id="ue10d0a8f" id="ue10d0a8f"><br></p>
  <p data-lake-id="ue579769a" id="ue579769a"><code data-lake-id="u704c1272" id="u704c1272"><span data-lake-id="uf33e489d" id="uf33e489d">set session transaction isolatin level repeatable read;</span></code></p>
  <p data-lake-id="u9d259575" id="u9d259575"><br></p>
  <p data-lake-id="u0d268157" id="u0d268157"><span data-lake-id="uacb7af1f" id="uacb7af1f">4.设置系统当前隔离级别</span></p>
  <p data-lake-id="u0abecb6c" id="u0abecb6c"><span data-lake-id="ue5cc5ab0" id="ue5cc5ab0">​</span><br></p>
  <p data-lake-id="ubaae39bf" id="ubaae39bf"><code data-lake-id="ue7de9192" id="ue7de9192"><span data-lake-id="uf1e4e17b" id="uf1e4e17b">set global transaction isolation level repeatable read;</span></code></p>
  <p data-lake-id="u440f56c1" id="u440f56c1"><br></p>
  <p data-lake-id="u8aa6750b" id="u8aa6750b"><span data-lake-id="ude0dd886" id="ude0dd886">5.命令行，开始事务时</span></p>
  <p data-lake-id="u1140dd61" id="u1140dd61"><span data-lake-id="u6e6403aa" id="u6e6403aa">​</span><br></p>
  <p data-lake-id="ub7cc3a38" id="ub7cc3a38"><code data-lake-id="u6d300e19" id="u6d300e19"><span data-lake-id="u5fd76f76" id="u5fd76f76">set autocommit=off 或者 start transaction</span></code></p>
  <p data-lake-id="ufcd59283" id="ufcd59283"><br></p>
  <h2 data-lake-id="MAvF9" id="MAvF9"><span data-lake-id="ua7e2cc1f" id="ua7e2cc1f">为什么MySQL默认的事务隔离级别是RR？</span></h2>
  <p data-lake-id="ue63cdb8a" id="ue63cdb8a"><br></p>
 </body>
</html>